package com.smart.community.region.controller;

import com.smart.community.feign.region.dto.RegionHierarchyInfo;
import com.smart.community.region.service.IRegionHierarchyService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 区域层级关系Feign接口实现Controller
 * 
 * 实现房户层级向上追溯的核心功能，为缴费系统提供房户到物业公司的快速定位服务
 * 业务场景：缴费系统根据房户ID → 查询层级关系 → 获取物业公司ID → 获取收款二维码
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-01-30
 */
@Slf4j
@RestController
@RequestMapping("/region/feign/region-hierarchy")  // ✅ 使用模块名/feign前缀，符合Feign接口开发规范
@Tag(name = "区域层级关系Feign接口", description = "区域层级关系相关Feign接口，支持缴费系统房户到物业公司的快速定位")
public class RegionHierarchyFeignController {

    @Autowired
    private IRegionHierarchyService regionHierarchyService;

    /**
     * 根据房户ID获取所属物业公司ID
     * 
     * 核心缴费接口：通过房户ID直接获取物业公司ID，用于获取收款二维码
     * 查询路径：房户 → 单元 → 楼栋 → 社区 → 物业公司
     * 
     * @param householdId 房户ID
     * @return 物业公司ID，如果查询失败或无关联返回null
     */
    @GetMapping("/feign/household/{householdId}/property-company-id")
    @Operation(summary = "根据房户ID获取所属物业公司ID", description = "缴费系统核心接口，通过房户ID快速定位物业公司")
    public Long getPropertyCompanyIdByHouseholdId(@Parameter(description = "房户ID") @PathVariable("householdId") Long householdId) {  // ✅ 直接返回数据，不包装Result
        log.info("根据房户ID获取物业公司ID，房户ID：{}", householdId);
        try {
            if (householdId == null) {
                log.warn("房户ID为空，无法查询物业公司ID");
                return null;
            }
            
            Long propertyCompanyId = regionHierarchyService.getPropertyCompanyIdByHouseholdId(householdId);
            
            if (propertyCompanyId != null) {
                log.info("根据房户ID获取物业公司ID成功，房户ID：{}，物业公司ID：{}", householdId, propertyCompanyId);
            } else {
                log.warn("根据房户ID未找到关联的物业公司，房户ID：{}", householdId);
            }
            
            return propertyCompanyId;  // ✅ 直接返回数据
        } catch (Exception e) {
            log.error("根据房户ID获取物业公司ID失败，房户ID：{}", householdId, e);
            return null; // ✅ 返回null而不是抛出异常
        }
    }

    /**
     * 根据房户ID获取完整的层级信息
     * 
     * 返回房户所属的单元、楼栋、社区、物业公司的完整ID和名称信息
     * 用于需要展示完整层级路径的业务场景
     * 
     * @param householdId 房户ID
     * @return 层级信息对象，包含各级ID和名称
     */
    @GetMapping("/feign/household/{householdId}/hierarchy-info")
    @Operation(summary = "根据房户ID获取完整的层级信息", description = "获取房户完整的层级结构信息，包括各级ID和名称")
    public RegionHierarchyInfo getRegionHierarchyByHouseholdId(@Parameter(description = "房户ID") @PathVariable("householdId") Long householdId) {
        log.info("根据房户ID获取层级信息，房户ID：{}", householdId);
        try {
            if (householdId == null) {
                log.warn("房户ID为空，无法查询层级信息");
                return new RegionHierarchyInfo();
            }
            
            RegionHierarchyInfo hierarchyInfo = regionHierarchyService.getRegionHierarchyByHouseholdId(householdId);
            
            if (hierarchyInfo != null && hierarchyInfo.isComplete()) {
                log.info("根据房户ID获取层级信息成功，房户ID：{}，社区ID：{}，物业公司ID：{}", 
                        householdId, hierarchyInfo.getCommunityId(), hierarchyInfo.getPropertyCompanyId());
            } else {
                log.warn("根据房户ID未找到完整的层级信息，房户ID：{}", householdId);
                if (hierarchyInfo == null) {
                    hierarchyInfo = new RegionHierarchyInfo();
                    hierarchyInfo.setHouseholdId(householdId);
                }
            }
            
            return hierarchyInfo;
        } catch (Exception e) {
            log.error("根据房户ID获取层级信息失败，房户ID：{}", householdId, e);
            RegionHierarchyInfo errorInfo = new RegionHierarchyInfo();
            errorInfo.setHouseholdId(householdId);
            return errorInfo; // ✅ 返回空对象而不是抛出异常
        }
    }

    /**
     * 批量根据房户ID获取物业公司ID
     * 
     * 用于批量缴费、批量查询等场景，提高查询效率
     * 返回房户ID与物业公司ID的映射关系
     * 
     * @param householdIds 房户ID列表
     * @return 房户ID与物业公司ID的映射关系，key为房户ID，value为物业公司ID
     */
    @PostMapping("/feign/households/property-company-ids")
    @Operation(summary = "批量根据房户ID获取物业公司ID", description = "批量获取房户对应的物业公司ID，提高批量业务处理效率")
    public Map<Long, Long> getPropertyCompanyIdsByHouseholdIds(@Parameter(description = "房户ID列表") @RequestBody List<Long> householdIds) {
        log.info("批量根据房户ID获取物业公司ID，房户ID数量：{}", householdIds != null ? householdIds.size() : 0);
        try {
            if (householdIds == null || householdIds.isEmpty()) {
                log.warn("房户ID列表为空，无法批量查询物业公司ID");
                return new HashMap<>();
            }
            
            Map<Long, Long> result = regionHierarchyService.getPropertyCompanyIdsByHouseholdIds(householdIds);
            
            log.info("批量根据房户ID获取物业公司ID成功，请求数量：{}，返回数量：{}", 
                    householdIds.size(), result != null ? result.size() : 0);
            
            return result != null ? result : new HashMap<>();
        } catch (Exception e) {
            log.error("批量根据房户ID获取物业公司ID失败，房户ID列表：{}", householdIds, e);
            return new HashMap<>(); // ✅ 返回空Map而不是抛出异常
        }
    }

    /**
     * 根据房户ID获取社区ID
     * 
     * 用于需要社区级别权限控制或社区数据统计的场景
     * 查询路径：房户 → 单元 → 楼栋 → 社区
     * 
     * @param householdId 房户ID
     * @return 社区ID，如果查询失败返回null
     */
    @GetMapping("/feign/household/{householdId}/community-id")
    @Operation(summary = "根据房户ID获取社区ID", description = "获取房户所属的社区ID，用于社区级别的数据查询")
    public Long getCommunityIdByHouseholdId(@Parameter(description = "房户ID") @PathVariable("householdId") Long householdId) {
        log.info("根据房户ID获取社区ID，房户ID：{}", householdId);
        try {
            if (householdId == null) {
                log.warn("房户ID为空，无法查询社区ID");
                return null;
            }
            
            Long communityId = regionHierarchyService.getCommunityIdByHouseholdId(householdId);
            
            if (communityId != null) {
                log.info("根据房户ID获取社区ID成功，房户ID：{}，社区ID：{}", householdId, communityId);
            } else {
                log.warn("根据房户ID未找到关联的社区，房户ID：{}", householdId);
            }
            
            return communityId;
        } catch (Exception e) {
            log.error("根据房户ID获取社区ID失败，房户ID：{}", householdId, e);
            return null; // ✅ 返回null而不是抛出异常
        }
    }

    /**
     * 批量根据房户ID获取社区ID
     * 
     * 用于批量社区数据查询，支持跨社区的数据统计和权限控制
     * 
     * @param householdIds 房户ID列表
     * @return 房户ID与社区ID的映射关系，key为房户ID，value为社区ID
     */
    @PostMapping("/feign/households/community-ids")
    @Operation(summary = "批量根据房户ID获取社区ID", description = "批量获取房户对应的社区ID，支持批量社区数据查询")
    public Map<Long, Long> getCommunityIdsByHouseholdIds(@Parameter(description = "房户ID列表") @RequestBody List<Long> householdIds) {
        log.info("批量根据房户ID获取社区ID，房户ID数量：{}", householdIds != null ? householdIds.size() : 0);
        try {
            if (householdIds == null || householdIds.isEmpty()) {
                log.warn("房户ID列表为空，无法批量查询社区ID");
                return new HashMap<>();
            }
            
            Map<Long, Long> result = regionHierarchyService.getCommunityIdsByHouseholdIds(householdIds);
            
            log.info("批量根据房户ID获取社区ID成功，请求数量：{}，返回数量：{}", 
                    householdIds.size(), result != null ? result.size() : 0);
            
            return result != null ? result : new HashMap<>();
        } catch (Exception e) {
            log.error("批量根据房户ID获取社区ID失败，房户ID列表：{}", householdIds, e);
            return new HashMap<>(); // ✅ 返回空Map而不是抛出异常
        }
    }
}
